写在前面
我们可以将panel理解成是多个DataFrame的层叠,每个DataFrame的名称对应为Panel的Minor_axis, 对于每一层的DataFrame而言, DataFrame的index为pandel的Major_aixs, DataFram的keys为panel的Items, 聚宽上读取的股票行情数据就是Panel格式的.
Panle使用技巧
从Minor_axis轴比较数据
例如:
p1 = pd.DataFrame({'stock1':[1,2,3,4], 'stock2':[2,3,4,5]}, index=['2010','2011','2012','2013']) p2 = pd.DataFrame({'stock1':[2,3,4,5], 'stock2':[3,4,5,6]}, index=['2010','2011','2012','2013']) >>> <class 'pandas.core.panel.Panel'> Dimensions: 2 (items) x 4 (major_axis) x 2 (minor_axis) Items axis: item1 to item2 Major_axis axis: 2010 to 2013 Minor_axis axis: stock1 to stock2
我们想要得到两个dataframe的最大值,类似下面的结果, 其中每个值取的是最大值
stock1 stock2 2010 2 3 2011 3 4 2012 4 5 2013 5 6
实现方法
func = lambda x: x[0] if x[0] >= x[1] else x[1] re_df = pd.DataFrame() # 提取minor_axis维数据, 比较完成之后重新构建一个dataframe for i in pn.minor_axis: re_df[i] = pn.minor_xs(i).apply(func, axis=1)
输出结果
stock1 stock2 2010 2 3 2011 3 4 2012 4 5 2013 5 6
multiindex
但是最近在使用pannel的时候,系统提示Panel结构在未来会被弃用, 建议使用DataFrame的MultiIndex代替,详细warning如下:
/opt/conda/lib/python3.6/site-packages/jqresearch/api.py:87: FutureWarning: Panel is deprecated and will be removed in a future version. The recommended way to represent these types of 3-dimensional data are with a MultiIndex on a DataFrame, via the Panel.to_frame() method Alternatively, you can use the xarray package http://xarray.pydata.org/en/stable/. Pandas provides a `.to_xarray()` method to help automate this conversion.
pandasde multiindex比Panel更加直观, 易于展示.
multiindex创建比较简单, 只要将DataFrame中的某两列指定为index即可.
df1 = pd.DataFrame({'课程':['语文','语文','数学','数学'],'得分':['最高','最低','最高','最低'],'分值':[90,50,100,60]}) df2 = df1.set_index(['课程','得分']) >>> df1 课程 得分 分值 0 语文 最高 90 1 语文 最低 50 2 数学 最高 100 3 数学 最低 60 >>> df2 分值 课程 得分 语文 最高 90 最低 50 数学 最高 100 最低 60
同样还可以使用DataFrame.stack和unstack来操作mutiindex
DataFrame.reset_index(), 可以将multimindex转换成单个dataframe
两个index互换可以通过DataFrame.swaplevel
索引内部排序, DataFrame.sortlevel
合并两个multiindex
df1 = pd.DataFrame({'课程':['语文','语文','数学','数学'],'得分':['最高','最低','最高','最低'],'分值':[90,50,100,60]}) df2 = pd.DataFrame({'课程':['语文','语文','数学','数学'],'得分':['最高','最低','最高','最低'],'属性':[9,5,10,6]}) df3 = df1.set_index(['课程','得分']) df4 = df2.set_index(['课程','得分']) df5 = pd.merge(df3, df4, left_index=True, right_index=True, how='inner')
输出:
分值 属性 课程 得分 语文 最高 90 9 最低 50 5 数学 最高 100 10 最低 60 6
参考文献
用一个月整理的Pandas的教程!最全面的教程没有之一!先收藏吧!
在pandas多重索引multiIndex中选定指定索引的行
Pandas reshape相关函数介绍(pivot,pivot_table,stack,unstack,melt)